表---list
对电话簿的插入和删除有可能很频繁。这样,对于表示一个简单的电话簿而言,采用表就可能比采用向量更为合适。例如写:
list<Entry> phone_book;
如果使用的是表,我们将倾向于不采用通过下标访问元素,像对向量的一般做法那样,而可能是检索这个表,去寻找具有某个给定值的元素。在这样做时,我们利用了这样的事实:表也是一个序列,如3.8节所述。
void print_entry(const string& s)
{
typedef list<Entry>::const_iterator LI;
for(LI i = phone_book.begin(); i != phone_book.end(); ++i)
{
const Entry& e = *i; // 采用引用是为了方便
if(s == e.name)
{
cout << e.name << ' ' << e.number << '\n';
return;
}
}
}
对 s
的检索从表的起始处开始,一直进行到 s
被找到,或是达到了表的结束位置。每个标准库容器都提供了函数 begin()
和 end()
,它们分别返回到容器中第一个元素和超过末尾一个元素的迭代器。对于一个给定的迭代器 i
,相应地下一个元素是 ++i
,它所引用的元素是 *i
。
用户不必知道标准容器的迭代器的确切类型。这种迭代器的类型是容器定义的一部分,可以通过名字引用。当我们不需要修改容器的元素时,const_iterator
就是我们所需要的类型。如果要修改元素,我们就应该用普通的 iterator
类型。
向一个list加入一个元素也很容易:
void add_entry(Entry& e, list<Entry>::iterator i)
{
phone_book.push_front(e); // 加在开头
phone_book.push_back(e); // 加在最后
phone_book.insert(i, e); // 加在'i'所引用的元素之前
}
🔚